package com.hrt.datasender.datasent.serial;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import com.btcode.common.PropertiesUnit;
import com.btcode.log.ILog;
import com.hrt.datasender.datadao.service.BdSendRecordService;
import com.hrt.datasender.datasent.DataSenderSerial;
import com.hrt.datasender.datastorage.StorageDataType;
import com.hrt.datasender.mq.MqKit;
import com.hrt.datasender.mq.model.PacketModel;
import com.hrt.datasender.process.strategy.hj212.MessagePraser;
import com.hrt.datasender.process.strategy.hj212.util.DataType;

public class SerialReader implements Runnable {
    private final int readBufferLength = 200;

    /**
     * 由于目前数采的传输机制，是建立在socket之上的，并且上层通过socket对端的ip和端口号，来更新对应数据的发送时间点，已达到续传的能力。
     * 而目前这个实现是基于串口的，串口没有所谓的对端ip和端口号，但为了延续上层的机制，固定给它分配ip和端口，并且ip和端口在配置文件中配置好。
     * 同时和上层平台端的ip端口配置要对应上
     */
    @Override
    public void run() {
        DataDecode decode = new DataDecode();

        while (true) {

            try {
                byte[] readBuffer = new byte[readBufferLength];
                int dataLength = SerialManager.getInstance().in.read(readBuffer);

                if (dataLength < 0) {
                    continue;
                }

                List<byte[]> models = decode.dataFrameDecode(readBuffer, dataLength);

                if (models.size() <= 0) {
                    continue;
                }

                for (byte[] model : models) {

                    String msg = new String(model);
                    ILog log = DataSenderSerial.log;
                    log.info("收到报文：" + msg);

                    String ip = PropertiesUnit.getValue("remoteip");
                    String port = PropertiesUnit.getValue("remoteport");

                    PacketModel packetModel = new PacketModel();
                    packetModel.setMsg(msg);
                    packetModel.setIp(ip);
                    packetModel.setPort(port);
                    MqKit.productMsgToCenterStationMQ(packetModel);

                    System.out.println("收到数据：" + new String(model));

                    /**
                     * 更新发送时间
                     */
                    HashMap<String, String> cpValueMap = MessagePraser.getCpValue(msg);
                    StorageDataType dataType = null;
                    String qn = cpValueMap.get("QN");
                    String cn = cpValueMap.get("CN");
                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                    Date dateTime = sf.parse(qn);
                    if (DataType.second.getCn().equals(cn)) {
                        dataType = StorageDataType.SECOND;
                    }
                    else if (DataType.minute.getCn().equals(cn)) {
                        dataType = StorageDataType.MINUTES;
                    }
                    else if (DataType.hour.getCn().equals(cn)) {
                        dataType = StorageDataType.HOUR;
                    }
                    else if (DataType.day.getCn().equals(cn)) {
                        dataType = StorageDataType.DAY;
                    }

                    BdSendRecordService.getInstance().updateLastSendDate(dataType, ip, port, dateTime);
                }

            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}
